package com.cc.pms.service.impl;

import com.alibaba.fastjson2.JSONObject;
import com.cc.pms.service.IMediaService;
import com.cc.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Slf4j
@Service
public class MediaServiceImpl implements IMediaService {

    @Override
    public  R<Map<String ,String>> uploadImage(MultipartFile file) {
        try {
            // 检查文件是否为空
            if (file == null || file.isEmpty()) {
                return R.fail(-1, "文件为空");
            }

            log.info("{} | 开始上传文件 | 文件名: {}","Image Upload", file.getOriginalFilename());

            // 检查文件大小是否超过5M
            long maxSize = 5 * 1024 * 1024; // 5MB
            if (file.getSize() > maxSize) {
                log.warn("{} | 文件大小不能超过5M" ,"Image Upload");
                return R.fail(-1, "文件大小不能超过5M");
            }

            // 获取文件的原始名称和扩展名
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                log.warn("{} | 文件名为空" ,"Image Upload");
                return R.fail(-1, "文件名为空");
            }
            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);

            // 生成新的文件名（UUID + 原扩展名）
            String newFilename = UUID.randomUUID() + "." + fileExtension;

            // 根据操作系统确定存储路径
            String os = System.getProperty("os.name").toLowerCase();
            String basePath;
            if (os.contains("win")) {
                basePath = "C:\\Users\\Dell\\Pictures\\Saved Pictures\\"; // Windows环境下存储在开发目录的resource下的images文件夹
            } else {
                basePath = "/app/images/"; // Linux环境下存储在/app/images路径
            }

            // 创建存储目录（如果不存在）
            File dir = new File(basePath);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 完整文件路径
            String filePath = basePath + newFilename;

            // 将文件保存到服务器
            try {
                File storeFile =  new File(filePath);
                file.transferTo(storeFile);
                // 如果是 Linux 系统，修改文件权限
                if (!os.contains("win")) {
                    Process process = Runtime.getRuntime().exec("chmod 644 " + filePath);
                    int exitCode = process.waitFor();
                    if (exitCode != 0) {
                        log.error("{} | 修改文件权限失败: {}", "Image Upload", filePath);
                    }
                }
            } catch (IOException e) {
                log.error("{} | 文件保存失败" ,"Image Upload" , e);
                return R.fail(-1, "文件保存失败: " + e.getMessage());
            }

            Map<String , String> map = new HashMap<>();
            map.put("url" , "/api/pms/images/" + newFilename );
            log.info("{} | 文件保存成功 | url: {}" ,"Image Upload" , JSONObject.toJSONString(map));
            return R.ok(map);

        } catch (Exception e) {
            log.error("{} | 上传文件失败" ,"Image Upload" , e);
            return R.fail(-1, "上传失败: " + e.getMessage());
        }
    }
}
